/*
 * @Author: Jimmy
 * @LastModifiedBy: Jimmy
 * @Date: 2024-05-25 22:35:42
 * @LastEditTime: 2024-07-07 15:46:58
 * @FilePath: /nest_study/server/src/common/utils/index.ts
 */
import Lodash from 'lodash';
import { v4 as uuidv4 } from 'uuid';
import dayjs from 'dayjs';
import isLeapYear from 'dayjs/plugin/isLeapYear'; // 导入插件
import timezone from 'dayjs/plugin/timezone'; // 导入插件
import utc from 'dayjs/plugin/utc'; // 导入插件
import 'dayjs/locale/zh-cn'; // 导入本地化语言
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.extend(isLeapYear); // 使用插件
dayjs.locale('zh-cn'); // 使用本地化语言
dayjs.tz.setDefault('Asia/Beijing');
/**
 * 获取当前时间
 * YYYY-MM-DD HH:mm:ss
 * @returns
 */
export const GetNowDateFormat = () => {
  return dayjs().format('YYYY-MM-DD HH:mm:ss');
}
/**
 * 获取当前时间
 * @returns
 */
export const getNowDate = () => {
  return new Date();
}

/**
 * 深拷贝
 * @param obj
 * @returns
 */
export function DeepClone(obj: object) {
  return Lodash.cloneDeep(obj);
}

/**
 * 生成唯一id
 * UUID
 * @returns
 */
export function GenerateUUID(): string {
  const uuid = uuidv4();
  return uuid.replaceAll('-', '');
}

/**
 * 数组转树结构
 * @param arr
 * @param getId
 * @param getLabel
 * @returns
 */
export function ListToTree(arr, getId, getLabel) {
  const kData = {}; // 以id做key的对象 暂时储存数据
  const lData = []; // 最终的数据 arr

  arr.forEach((m) => {
    let item = { ...m };
    m = {
      ...item,
      id: getId(m),
      name: getLabel(m),
      parentId: m.parentId,
    };
    kData[m.id] = {
      ...m
    };
    if (m.parentId === -1) {
      lData.push(kData[m.id]);
      lData.sort((prev,next)=>prev.sort - next.sort);
    } else {
      kData[m.parentId] = kData[m.parentId] || {};
      kData[m.parentId].children = kData[m.parentId].children || [];
      kData[m.parentId].children.push(kData[m.id]);
      kData[m.parentId].children.sort((prev: { sort: number; },next: { sort: number; })=>prev.sort - next.sort);
    }
  });
  return lData;
}

/**
 * 分页
 * @param data
 * @param size
 * @param page
 * @returns
 */
export function PaginationData(data: { list: Array<any>; size: number; page: number }, filterParam: any) {
  // 检查 size 和 page 的合法性
  if (data.size <= 0 || data.page < 0) {
    return [];
  }

  // 将数据转换为数组
  let arrayData = Lodash.toArray(data.list);

  if (Object.keys(filterParam).length > 0) {
    arrayData = Lodash.filter(arrayData, (item) => {
      const arr = [];
      if (filterParam.ipaddr) {
        arr.push(Boolean(item.ipaddr.includes(filterParam.ipaddr)));
      }

      if (filterParam.userName && item.username) {
        arr.push(Boolean(item.username.includes(filterParam.userName)));
      }
      return !Boolean(arr.includes(false));
    });
  }

  // 获取指定页的数据
  const pageData = arrayData.slice((data.page - 1) * data.size, data.page * data.size);

  return pageData;
}